#pragma once
#if 0
//这个是一个B是A的友元类。这个B可以在类B中访问A中的私有属性
class B;
class A {
public:
    explicit A(const int _value=10):value(_value){};
private:
    int value;
    friend B;
};
class B {
public:
    explicit B(const int _b =20):b(_b){};
    static void printA(const A& a) {
        std::cout << a.value << std::endl;
    }
private:
    int b;
};
#endif
#if 0
//普通的函数作为友元函数，可以访问这个类的私有性情
class A {
    public:
        explicit A(const int _value=10):value(_value){};
        friend void showData(const A& a);
    private:
        int value;
};

inline void showData(const A& a) {
    std::cout << a.value << std::endl;
}
#endif
#if 0
//如果是类柑橘函数，且要使用当前类的私有属性，这个函数必需要在此类中实现
template<typename T>
class A {
    public:
        explicit A(const T _value=10):value(_value){};
        friend void showData(const A& a){
            std::cout << a.value << std::endl;};
    private:
        T value;
    };
#endif
template<typename T>
class A {
public:
    explicit A(const T _value=10):value(_value){};
    template<typename U>
    friend void showData(const A& a,U& u) {
        std::cout << a.value << std::endl;
        std::cout << u << std::endl;
    };
private:
    T value;
};


